import Vue from 'vue'
import { Toast } from 'element-ui'

/** ****调用方法
 *
 *<form name="form" ref="validataForm"></form>
  form: {
        mobile: '13668152387', // 手机号
      },
  validataForm: {
    mobile: {
      'required': { message: '请输入手机号' },
      'mobile': { message: '手机号输入有误' }
    },

  }
  if (this..validata(this)) {} //表单
  if(this.$validata.very (rule, value, errmessage, params)){}  //单词验证
 *
 */
const Validata = {
  rules: {
    mobile (value, params, errmessage = '输入手机号码有误') { // 是否是手机号码
      value = unescape(value)
      var reg = /^[1][\d][\d]{9}$/
      var status = reg.test(value)
      return {
        status: status,
        errmessage: errmessage
      }
    },
    license (value, params, errmessage = '输入车牌号有误') { // 是否是车牌号
      value = value.trim()
      var reg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/
      var status = reg.test(value)
      return {
        status: status,
        errmessage: errmessage
      }
    },
    vin (value, params, errmessage = '输入车辆识别码有误') { // 是否是车辆识别码
      value = value.trim()
      var reg = /^[A-Z\d]{17}$/
      var status = reg.test(value)
      return {
        status: status,
        errmessage: errmessage
      }
    },
    engine (value, params, errmessage = '输入发动机号有误') { // 是否是车辆识别码
      value = value.trim()
      var reg = /^[A-Z\d]{1,20}$/
      var status = reg.test(value)
      return {
        status: status,
        errmessage: errmessage
      }
    },
    sureData (value, params, errmessage = '两次密码输入不同') { // 验证密码/数据是否与数据一样
      value = value.trim()
      var $this = params.vue
      var prop = params.prop
      var formname = $this.$refs.validataForm.name || 'form'
      var oldValue = $this[prop] || $this[formname][prop]
      var status = oldValue === value
      return {
        status: status,
        errmessage: errmessage
      }
    },
    required (value, params, errmessage = '数据不完全') { // 是否是必须
      value = value.trim()
      var status = !!value
      return {
        status: status,
        errmessage: errmessage
      }
    },
    email (value, params, errmessage = '邮箱格式错误') { // 邮箱
      var reg = new RegExp('^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$')
      var status = reg.test(value)
      return {
        status: status,
        errmessage: errmessage
      }
    },
    password (value, params, errmessage = '密码有误') { // 密码
      var reg = /^[\w]{8,20}$/
      var status = reg.test(value)
      return {
        status: status,
        errmessage: errmessage
      }
    },
    idcard (value, params, errmessage = '身份证输入有误') { // 身份证是否合法
      var idCardNoUtil = {
        /* 省,直辖市代码表*/
        provinceAndCitys: { 11: '北京', 12: '天津', 13: '河北', 14: '山西', 15: '内蒙古', 21: '辽宁', 22: '吉林', 23: '黑龙江',
          31: '上海', 32: '江苏', 33: '浙江', 34: '安徽', 35: '福建', 36: '江西', 37: '山东', 41: '河南', 42: '湖北', 43: '湖南', 44: '广东',
          45: '广西', 46: '海南', 50: '重庆', 51: '四川', 52: '贵州', 53: '云南', 54: '西藏', 61: '陕西', 62: '甘肃', 63: '青海', 64: '宁夏',
          65: '新疆', 71: '台湾', 81: '香港', 82: '澳门', 91: '国外' },
        /* 每位加权因子*/
        powers: ['7', '9', '10', '5', '8', '4', '2', '1', '6', '3', '7', '9', '10', '5', '8', '4', '2'],
        /* 第18位校检码*/
        parityBit: ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'],
        /* 性别*/
        genders: { male: '男', female: '女' },
        /* 校验地址码*/
        checkAddressCode: function (addressCode) {
          var check = /^[1-9]\d{5}$/.test(addressCode)
          if (!check) return false
          if (idCardNoUtil.provinceAndCitys[parseInt(addressCode.substring(0, 2))]) {
            return true
          } else {
            return false
          }
        },
        /* 校验日期码*/
        checkBirthDayCode: function (birDayCode) {
          var check = /^[1-9]\d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))$/.test(birDayCode)
          if (!check) return false
          var yyyy = parseInt(birDayCode.substring(0, 4), 10)
          var mm = parseInt(birDayCode.substring(4, 6), 10)
          var dd = parseInt(birDayCode.substring(6), 10)
          var xdata = new Date(yyyy, mm - 1, dd)
          if (xdata > new Date()) {
            return false// 生日不能大于当前日期
          } else if ((xdata.getFullYear() === yyyy) && (xdata.getMonth() === mm - 1) && (xdata.getDate() === dd)) {
            return true
          } else {
            return false
          }
        },

        /* 计算校检码*/
        getParityBit: function (idCardNo) {
          var id17 = idCardNo.substring(0, 17)
          /* 加权 */
          var power = 0
          for (var i = 0; i < 17; i++) {
            power += parseInt(id17.charAt(i), 10) * parseInt(idCardNoUtil.powers[i])
          }
          /* 取模*/
          var mod = power % 11
          return idCardNoUtil.parityBit[mod]
        },

        /* 验证校检码*/
        checkParityBit: function (idCardNo) {
          var parityBit = idCardNo.charAt(17).toUpperCase()
          if (idCardNoUtil.getParityBit(idCardNo) === parityBit) {
            return true
          } else {
            return false
          }
        },

        /* 校验15位或18位的身份证号码*/
        checkIdCardNo: function (idCardNo) {
          // 15位和18位身份证号码的基本校验
          var check = /^\d{15}|(\d{17}(\d|x|X))$/.test(idCardNo)
          if (!check) return false
          // 判断长度为15位或18位
          if (idCardNo.length === 15) {
            return idCardNoUtil.check15IdCardNo(idCardNo)
          } else if (idCardNo.length === 18) {
            return idCardNoUtil.check18IdCardNo(idCardNo)
          } else {
            return false
          }
        },
        // 校验15位的身份证号码
        check15IdCardNo: function (idCardNo) {
          // 15位身份证号码的基本校验
          var check = /^[1-9]\d{7}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}$/.test(idCardNo)
          if (!check) return false
          // 校验地址码
          var addressCode = idCardNo.substring(0, 6)
          check = idCardNoUtil.checkAddressCode(addressCode)
          if (!check) return false
          var birDayCode = '19' + idCardNo.substring(6, 12)
          // 校验日期码
          return idCardNoUtil.checkBirthDayCode(birDayCode)
        },

        // 校验18位的身份证号码
        check18IdCardNo: function (idCardNo) {
          // 18位身份证号码的基本格式校验
          var check = /^[1-9]\d{5}[1-9]\d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}(\d|x|X)$/.test(idCardNo)
          if (!check) return false
          // 校验地址码
          var addressCode = idCardNo.substring(0, 6)
          check = idCardNoUtil.checkAddressCode(addressCode)
          if (!check) return false
          // 校验日期码
          var birDayCode = idCardNo.substring(6, 14)
          check = idCardNoUtil.checkBirthDayCode(birDayCode)
          if (!check) return false
          // 验证校检码
          return idCardNoUtil.checkParityBit(idCardNo)
        },

        formateDateCN: function (day) {
          var yyyy = day.substring(0, 4)
          var mm = day.substring(4, 6)
          var dd = day.substring(6)
          return yyyy + '-' + mm + '-' + dd
        },

        // 获取信息
        getIdCardInfo: function (idCardNo) {
          var idCardInfo = {
            gender: '', // 性别
            birthday: '' // 出生日期(yyyy-mm-dd)
          }
          if (idCardNo.length === 15) {
            var aday = '19' + idCardNo.substring(6, 12)
            idCardInfo.birthday = idCardNoUtil.formateDateCN(aday)
            if (parseInt(idCardNo.charAt(14)) % 2 === 0) {
              idCardInfo.gender = idCardNoUtil.genders.female
            } else {
              idCardInfo.gender = idCardNoUtil.genders.male
            }
          } else if (idCardNo.length === 18) {
            aday = idCardNo.substring(6, 14)
            idCardInfo.birthday = idCardNoUtil.formateDateCN(aday)
            if (parseInt(idCardNo.charAt(16)) % 2 === 0) {
              idCardInfo.gender = idCardNoUtil.genders.female
            } else {
              idCardInfo.gender = idCardNoUtil.genders.male
            }
          }
          return idCardInfo
        },
        /* 18位转15位*/
        getId15: function (idCardNo) {
          if (idCardNo.length === 15) {
            return idCardNo
          } else if (idCardNo.length === 18) {
            return idCardNo.substring(0, 6) + idCardNo.substring(8, 17)
          } else {
            return null
          }
        },
        /* 15位转18位*/
        getId18: function (idCardNo) {
          if (idCardNo.length === 15) {
            var id17 = idCardNo.substring(0, 6) + '19' + idCardNo.substring(6)
            var parityBit = idCardNoUtil.getParityBit(id17)
            return id17 + parityBit
          } else if (idCardNo.length === 18) {
            return idCardNo
          } else {
            return null
          }
        }
      }
      var status = idCardNoUtil.checkIdCardNo(value)
      return {
        status: status,
        errmessage: errmessage
      }
    },
    bankcard (value, params, errmessage = '银行卡输入有误') { // 银行卡是否合法
      /* eslint-disable */
      function checkbankCard(value) {
        //长度
        if (value.length < 16 || value.length > 19) {
          return false
        }
        // 全数字
        var num = /^\d*$/ 
        if (!num.exec(value)) {
         
          return false
        }
        // 开头6位
        var strBin = '10,18,30,35,37,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,58,60,62,65,68,69,84,87,88,94,95,98,99'
        if (strBin.indexOf(value.substring(0, 2)) == -1) {
          return false
        }
        //与luhm进行比较
        var lastNum = value.substr(value.length - 1, 1)// 取出最后一位（与luhm进行比较）
        var first15Num = value.substr(0, value.length - 1)// 前15或18位
        var newArr = new Array()
        for (var i = first15Num.length - 1; i > -1; i--) { // 前15或18位倒序存进数组
          newArr.push(first15Num.substr(i, 1))
        }
        var arrJiShu = new Array() // 奇数位*2的积 <9
        var arrJiShu2 = new Array() // 奇数位*2的积 >9
        var arrOuShu = new Array() // 偶数位数组
        for (var j = 0; j < newArr.length; j++) {
          if ((j + 1) % 2 == 1) { // 奇数位
            if (parseInt(newArr[j]) * 2 < 9) { arrJiShu.push(parseInt(newArr[j]) * 2) } else { arrJiShu2.push(parseInt(newArr[j]) * 2) }
          } else // 偶数位
          { arrOuShu.push(newArr[j]) }
        }
        var jishu_child1 = new Array()// 奇数位*2 >9 的分割之后的数组个位数
        var jishu_child2 = new Array()// 奇数位*2 >9 的分割之后的数组十位数
        for (var h = 0; h < arrJiShu2.length; h++) {
          jishu_child1.push(parseInt(arrJiShu2[h]) % 10)
          jishu_child2.push(parseInt(arrJiShu2[h]) / 10)
        }
        var sumJiShu = 0 // 奇数位*2 < 9 的数组之和
        var sumOuShu = 0 // 偶数位数组之和
        var sumJiShuChild1 = 0 // 奇数位*2 >9 的分割之后的数组个位数之和
        var sumJiShuChild2 = 0 // 奇数位*2 >9 的分割之后的数组十位数之和
        var sumTotal = 0
        for (var m = 0; m < arrJiShu.length; m++) {
          sumJiShu = sumJiShu + parseInt(arrJiShu[m])
        }
        for (var n = 0; n < arrOuShu.length; n++) {
          sumOuShu = sumOuShu + parseInt(arrOuShu[n])
        }
        for (var p = 0; p < jishu_child1.length; p++) {
          sumJiShuChild1 = sumJiShuChild1 + parseInt(jishu_child1[p])
          sumJiShuChild2 = sumJiShuChild2 + parseInt(jishu_child2[p])
        }
        // 计算总和
        sumTotal = parseInt(sumJiShu) + parseInt(sumOuShu) + parseInt(sumJiShuChild1) + parseInt(sumJiShuChild2)
        // 计算Luhm值
        var k = parseInt(sumTotal) % 10 == 0 ? 10 : parseInt(sumTotal) % 10
        var luhm = 10 - k
        if (lastNum == luhm) {
          return true
        } else {
          return false
        }
      }
      var status=checkbankCard(value)
      // console.log(status)
      return {
        status: status,
        errmessage: errmessage
      }
    }
  },
   /* eslint-enable */

  very (rule, value, errmessage, params) { // 验证
    var result = this.rules[rule](value, params)
    errmessage = errmessage || result.errmessage
    var status = result.status
    // console.log(status)
    if (!status) {
      Toast(errmessage)
      return false
    }
    return true
  },
  veryBatch (data, rules) {
    for (var dataname in rules) {
      if (data.hasOwnProperty(dataname)) {
        for (var rulename in rules[dataname]) {
          var rule = rules[dataname][rulename]
          var value = ''
          switch (typeof (data[dataname])) {
            case 'object':
              value = data[dataname].value
              break
            default:
              value = data[dataname]
              break
          }
          if (!this.very(rulename, value, rule.message, rule.params)) return false
        }
      }
    }
    return true
  },
  validata ($this) {
    var rules = $this.validataForm
    var formname = $this.$refs.validataForm.name || 'form'
    // var inputs = $this.$refs.validataForm.querySelectorAll('input')
    // 方法一 根据传入的rule来判断
    for (var dataname in rules) {
      for (var rulename in rules[dataname]) {
        var rule = rules[dataname][rulename]
        if (!this.very(rulename, $this[formname][dataname], rule.message, rule.params)) return false
      }
    }
    return true
    // var formname = $this.$refs.validataForm.name || 'from'
    // var inputs = $this.$refs.validataForm.querySelectorAll('input')
    // 方法一 根据传入的rule来判断
    // Object.keys(rules).map(v => {
    //   // var dataname = v
    //   var ruleArr = Object.entries(rules[v])
    //   console.log(ruleArr)
    //   // Object.entries(rules[v]).map(([rulename, rule]) => {
    //   //   console.log(rulename)
    //   //   if (!this.very(rulename, $this[formname][dataname], rule.message, rule.params)) return false
    //   // })
    // })
  }
}
Vue.prototype.$validata = Validata
